home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Misc / vcrplus / encode.c < prev    next >
C/C++ Source or Header  |  1995-06-12  |  14KB  |  772 lines

  1. #include <stdio.h>
  2.  
  3. #define        KEY001    (9371)
  4. #define        INVALID    (-987)
  5.  
  6.  
  7. /* function that performs initial scrambling */
  8. int    mixup(x, y)
  9.     int    x, y;
  10. {
  11.     int    i, j, k, sum;
  12.  
  13.     int    a[12], b[12], out[12] ;
  14.  
  15.     /* get the digits of x into a[] */
  16.     j = x ;
  17.     for(i=0; i<9; i++)
  18.     {
  19.         k = j % 10;
  20.         a[i] = k;
  21.         j = (j - k) / 10 ;
  22.     }
  23.  
  24.     /* get the digits of y into b[] */
  25.     j = y ;
  26.     for(i=0; i<9; i++)
  27.     {
  28.         k = j % 10;
  29.         b[i] = k;
  30.         j = (j - k) / 10 ;
  31.         out[i] = 0;
  32.     }
  33.  
  34.  
  35.     for(i=0; i<=8; i++)
  36.     {
  37.         for(j=0; j<=8; j++)
  38.         {
  39.             out[i+j] += (b[j] * a[i]) ;
  40.         }
  41.     }
  42.  
  43.     j = 1;
  44.     sum = 0;
  45.     for(i=0; i<=8; i++)
  46.     {
  47.         sum += j * (out[i] % 10);
  48.         j = j * 10 ;
  49.     }
  50.     return( sum ) ;
  51. }
  52.  
  53.  
  54.  
  55. /* first function */
  56. int    f1(inval)
  57.     int    inval ;
  58. {
  59.     int    ndigits, hashval ;
  60.     int    pwr ;
  61.  
  62.  
  63.     ndigits = 0;
  64.     pwr = 1;
  65.     while(inval >= pwr) { ndigits++; pwr *= 10; }
  66.     if(ndigits > 8) printf("\nPANIC: %d has %d digits\n", inval, ndigits);
  67.     pwr = pwr / 10 ;
  68.  
  69.     hashval = inval;
  70. again:    hashval = mixup(hashval, KEY001) % (pwr * 10) ;
  71.     if(hashval < pwr) goto again ;
  72.  
  73.     return(hashval);
  74. }
  75.  
  76.  
  77.  
  78.  
  79. /* the 512-entry tables of starting time and pgm duration */
  80. int    lookup(stime, durat)
  81.     int    stime, durat ;
  82. {
  83.     static    int    start[480], leng[480] ;
  84.     static    int    initializer = 0;
  85.  
  86.     int    s, j;
  87.  
  88.     if(initializer == 0) {
  89.     initializer = 1;
  90.  
  91.     for(j=0; j<512; j++) { start[j] = leng[j] = INVALID; }
  92.  
  93.     leng[0]   =  30 ;
  94.     leng[100] = 120 ;
  95.     leng[101] =  90 ;
  96.     leng[102] = 120 ;
  97.     leng[103] = 120 ;
  98.     leng[104] =  90 ;
  99.     leng[105] =  90 ;
  100.     leng[106] =  30 ;
  101.     leng[107] =  30 ;
  102.     leng[108] = 120 ;
  103.     leng[109] =  90 ;
  104.     leng[10]  =  30 ;
  105.     leng[110] =  90 ;
  106.     leng[111] =  30 ;
  107.     leng[112] =  90 ;
  108.     leng[113] =  30 ;
  109.     leng[114] =  30 ;
  110.     leng[115] = 120 ;
  111.     leng[116] =  30 ;
  112.     leng[117] = 120 ;
  113.     leng[118] = 120 ;
  114.     leng[119] =  30 ;
  115.     leng[11]  =  30 ;
  116.     leng[120] =  90 ;
  117.     leng[121] =  60 ;
  118.     leng[122] =  60 ;
  119.     leng[123] =  60 ;
  120.     leng[124] = 120 ;
  121.     leng[125] =  90 ;
  122.     leng[126] =  60 ;
  123.     leng[127] =  60 ;
  124.     leng[128] =  90 ;
  125.     leng[129] = 120 ;
  126.     leng[12]  =  30 ;
  127.     leng[130] = 120 ;
  128.     leng[131] =  90 ;
  129.     leng[132] =  60 ;
  130.     leng[133] =  60 ;
  131.     leng[134] = 120 ;
  132.     leng[135] =  90 ;
  133.     leng[136] =  90 ;
  134.     leng[137] = 120 ;
  135.     leng[138] = 120 ;
  136.     leng[139] =  60 ;
  137.     leng[13]  = 120 ;
  138.     leng[140] =  60 ;
  139.     leng[141] =  90 ;
  140.     leng[142] =  90 ;
  141.     leng[143] = 120 ;
  142.     leng[144] =  90 ;
  143.     leng[145] = 120 ;
  144.     leng[146] =  90 ;
  145.     leng[147] = 120 ;
  146.     leng[148] = 120 ;
  147.     leng[149] =  90 ;
  148.     leng[14]  =  30 ;
  149.     leng[150] = 120 ;
  150.     leng[151] =  90 ;
  151.     leng[152] =  90 ;
  152.     leng[153] =  90 ;
  153.     leng[154] =  60 ;
  154.     leng[155] =  60 ;
  155.     leng[156] = 120 ;
  156.     leng[157] =  60 ;
  157.     leng[158] =  60 ;
  158.     leng[159] =  60 ;
  159.     leng[15]  =  30 ;
  160.     leng[160] = 120 ;
  161.     leng[161] =  60 ;
  162.     leng[162] =  90 ;
  163.     leng[163] =  90 ;
  164.     leng[164] =  60 ;
  165.     leng[165] =  90 ;
  166.     leng[166] =  90 ;
  167.     leng[167] =  60 ;
  168.     leng[168] =  90 ;
  169.     leng[169] = 120 ;
  170.     leng[16]  = 120 ;
  171.     leng[170] =  60 ;
  172.     leng[171] = 120 ;
  173.     leng[172] =  60 ;
  174.     leng[173] =  60 ;
  175.     leng[174] = 120 ;
  176.     leng[175] =  90 ;
  177.     leng[176] =  60 ;
  178.     leng[177] = 120 ;
  179.     leng[178] =  60 ;
  180.     leng[179] =  60 ;
  181.     leng[17]  = 120 ;
  182.     leng[180] =  60 ;
  183.     leng[181] =  90 ;
  184.     leng[182] =  60 ;
  185.     leng[183] = 120 ;
  186.     leng[184] =  60 ;
  187.     leng[185] =  60 ;
  188.     leng[186] =  90 ;
  189.     leng[187] =  60 ;
  190.     leng[188] =  90 ;
  191.     leng[189] = 120 ;
  192.     leng[18]  =  60 ;
  193.     leng[190] =  90 ;
  194.     leng[191] =  90 ;
  195.     leng[19]  = 120 ;
  196.     leng[1]   =  30 ;
  197.     leng[20]  =  60 ;
  198.     leng[21]  =  60 ;
  199.     leng[22]  =  60 ;
  200.     leng[23]  = 120 ;
  201.     leng[24]  =  60 ;
  202.     leng[25]  = 120 ;
  203.     leng[26]  =  30 ;
  204.     leng[27]  =  30 ;
  205.     leng[28]  =  30 ;
  206.     leng[29]  =  60 ;
  207.     leng[2]   =  30 ;
  208.     leng[30]  =  90 ;
  209.     leng[31]  =  30 ;
  210.     leng[32]  =  30 ;
  211.     leng[33]  =  30 ;
  212.     leng[34]  =  30 ;
  213.     leng[35]  =  60 ;
  214.     leng[36]  =  30 ;
  215.     leng[37]  =  60 ;
  216.     leng[38]  = 120 ;
  217.     leng[39]  =  60 ;
  218.     leng[3]   =  30 ;
  219.     leng[40]  =  30 ;
  220.     leng[41]  =  30 ;
  221.     leng[42]  =  30 ;
  222.     leng[43]  =  30 ;
  223.     leng[44]  = 120 ;
  224.     leng[45]  =  30 ;
  225.     leng[46]  =  30 ;
  226.     leng[47]  =  30 ;
  227.     leng[48]  = 120 ;
  228.     leng[49]  =  30 ;
  229.     leng[4]   =  30 ;
  230.     leng[50]  =  60 ;
  231.     leng[51]  =  60 ;
  232.     leng[52]  =  30 ;
  233.     leng[53]  =  30 ;
  234.     leng[54]  = 120 ;
  235.     leng[55]  =  60 ;
  236.     leng[56]  =  60 ;
  237.     leng[57]  =  30 ;
  238.     leng[58]  = 120 ;
  239.     leng[59]  =  30 ;
  240.     leng[5]   =  30 ;
  241.     leng[60]  = 120 ;
  242.     leng[61]  = 120 ;
  243.     leng[62]  = 120 ;
  244.     leng[63]  =  30 ;
  245.     leng[64]  =  90 ;
  246.     leng[65]  =  30 ;
  247.     leng[66]  =  30 ;
  248.     leng[67]  =  30 ;
  249.     leng[68]  = 120 ;
  250.     leng[69]  =  90 ;
  251.     leng[6]   =  30 ;
  252.     leng[70]  =  90 ;
  253.     leng[71]  =  60 ;
  254.     leng[72]  =  90 ;
  255.     leng[73]  =  90 ;
  256.     leng[74]  =  90 ;
  257.     leng[75]  =  90 ;
  258.     leng[76]  =  90 ;
  259.     leng[77]  =  60 ;
  260.     leng[78]  =  90 ;
  261.     leng[79]  =  30 ;
  262.     leng[7]   =  30 ;
  263.     leng[80]  = 120 ;
  264.     leng[81]  =  60 ;
  265.     leng[82]  =  90 ;
  266.     leng[83]  = 120 ;
  267.     leng[84]  =  60 ;
  268.     leng[85]  =  60 ;
  269.     leng[86]  = 120 ;
  270.     leng[87]  =  30 ;
  271.     leng[88]  =  90 ;
  272.     leng[89]  = 120 ;
  273.     leng[8]   =  30 ;
  274.     leng[90]  = 120 ;
  275.     leng[91]  =  90 ;
  276.     leng[92]  =  90 ;
  277.     leng[93]  =  90 ;
  278.     leng[94]  =  90 ;
  279.     leng[95]  = 120 ;
  280.     leng[96]  =  60 ;
  281.     leng[97]  = 120 ;
  282.     leng[98]  =  90 ;
  283.     leng[99]  =  30 ;
  284.     leng[9]   =  60 ;
  285.     start[0]   = 1830 ;
  286.     start[100] =  330 ;
  287.     start[101] = 1500 ;
  288.     start[102] = 1500 ;
  289.     start[103] = 2300 ;
  290.     start[104] = 1900 ;
  291.     start[105] =  800 ;
  292.     start[106] =  430 ;
  293.     start[107] =  300 ;
  294.     start[108] = 1330 ;
  295.     start[109] = 1000 ;
  296.     start[10]  = 1400 ;
  297.     start[110] =  700 ;
  298.     start[111] =  100 ;
  299.     start[112] = 2330 ;
  300.     start[113] =  330 ;
  301.     start[114] =  200 ;
  302.     start[115] = 2230 ;
  303.     start[116] =  400 ;
  304.     start[117] =  600 ;
  305.     start[118] =  400 ;
  306.     start[119] =  230 ;
  307.     start[11]  = 2030 ;
  308.     start[120] =  630 ;
  309.     start[121] =   30 ;
  310.     start[122] = 2230 ;
  311.     start[123] =  100 ;
  312.     start[124] =   30 ;
  313.     start[125] = 2300 ;
  314.     start[126] = 1630 ;
  315.     start[127] =  830 ;
  316.     start[128] =    0 ;
  317.     start[129] = 1930 ;
  318.     start[12]  = 1700 ;
  319.     start[130] =  930 ;
  320.     start[131] = 2030 ;
  321.     start[132] =  500 ;
  322.     start[133] = 1730 ;
  323.     start[134] =  200 ;
  324.     start[135] = 1930 ;
  325.     start[136] =  930 ;
  326.     start[137] = 1730 ;
  327.     start[138] =  630 ;
  328.     start[139] = 1830 ;
  329.     start[13]  = 1600 ;
  330.     start[140] = 1430 ;
  331.     start[141] = 1130 ;
  332.     start[142] =   30 ;
  333.     start[143] =  830 ;
  334.     start[144] = 1030 ;
  335.     start[145] = 1430 ;
  336.     start[146] =  100 ;
  337.     start[147] =  730 ;
  338.     start[148] = 2030 ;
  339.     start[149] =  300 ;
  340.     start[14]  = 2000 ;
  341.     start[150] =  300 ;
  342.     start[151] = 1330 ;
  343.     start[152] = 1230 ;
  344.     start[153] =  230 ;
  345.     start[154] = 2130 ;
  346.     start[155] = 1130 ;
  347.     start[156] = 1830 ;
  348.     start[157] =  630 ;
  349.     start[158] =  530 ;
  350.     start[159] =  200 ;
  351.     start[15]  = 1500 ;
  352.     start[160] = 1530 ;
  353.     start[161] =  730 ;
  354.     start[162] =  600 ;
  355.     start[163] = 1730 ;
  356.     start[164] =  400 ;
  357.     start[165] =  730 ;
  358.     start[166] =  430 ;
  359.     start[167] =  430 ;
  360.     start[168] =  130 ;
  361.     start[169] = 1230 ;
  362.     start[16]  = 2000 ;
  363.     start[170] =  130 ;
  364.     start[171] =  230 ;
  365.     start[172] = 1930 ;
  366.     start[173] =  300 ;
  367.     start[174] = 1030 ;
  368.     start[175] =  200 ;
  369.     start[176] =  330 ;
  370.     start[177] =  500 ;
  371.     start[178] =  930 ;
  372.     start[179] =  230 ;
  373.     start[17]  = 2100 ;
  374.     start[180] = 2030 ;
  375.     start[181] =  400 ;
  376.     start[182] = 1530 ;
  377.     start[183] =  430 ;
  378.     start[184] = 1330 ;
  379.     start[185] = 1230 ;
  380.     start[186] =  330 ;
  381.     start[187] = 1030 ;
  382.     start[188] =  500 ;
  383.     start[189] =  530 ;
  384.     start[18]  = 2000 ;
  385.     start[190] =  530 ;
  386.     start[191] = 1100 ;
  387.     start[19]  = 1800 ;
  388.     start[1]   = 1600 ;
  389.     start[20]  = 1900 ;
  390.     start[21]  = 2200 ;
  391.     start[22]  = 2100 ;
  392.     start[23]  = 1400 ;
  393.     start[24]  = 1500 ;
  394.     start[25]  = 2200 ;
  395.     start[26]  = 1130 ;
  396.     start[27]  = 1100 ;
  397.     start[28]  = 2300 ;
  398.     start[29]  = 1600 ;
  399.     start[2]   = 1930 ;
  400.     start[30]  = 2100 ;
  401.     start[31]  = 2100 ;
  402.     start[32]  = 1230 ;
  403.     start[33]  = 1330 ;
  404.     start[34]  =  930 ;
  405.     start[35]  = 1300 ;
  406.     start[36]  = 2130 ;
  407.     start[37]  = 1200 ;
  408.     start[38]  = 1000 ;
  409.     start[39]  = 1800 ;
  410.     start[3]   = 1630 ;
  411.     start[40]  = 2200 ;
  412.     start[41]  = 1200 ;
  413.     start[42]  =  800 ;
  414.     start[43]  =  830 ;
  415.     start[44]  = 1700 ;
  416.     start[45]  =  900 ;
  417.     start[46]  = 2230 ;
  418.     start[47]  = 1030 ;
  419.     start[48]  = 1900 ;
  420.     start[49]  =  730 ;
  421.     start[4]   = 1530 ;
  422.     start[50]  = 2300 ;
  423.     start[51]  = 1000 ;
  424.     start[52]  =  700 ;
  425.     start[53]  = 1300 ;
  426.     start[54]  =  700 ;
  427.     start[55]  = 1100 ;
  428.     start[56]  = 1400 ;
  429.     start[57]  = 1000 ;
  430.     start[58]  =  800 ;
  431.     start[59]  = 2330 ;
  432.     start[5]   = 1730 ;
  433.     start[60]  = 1300 ;
  434.     start[61]  = 1200 ;
  435.     start[62]  =  900 ;
  436.     start[63]  =  630 ;
  437.     start[64]  = 1800 ;
  438.     start[65]  =  600 ;
  439.     start[66]  =  530 ;
  440.     start[67]  =    0 ;
  441.     start[68]  = 2330 ;
  442.     start[69]  = 2200 ;
  443.     start[6]   = 1800 ;
  444.     start[70]  = 1300 ;
  445.     start[71]  =  900 ;
  446.     start[72]  = 1630 ;
  447.     start[73]  = 1600 ;
  448.     start[74]  = 1430 ;
  449.     start[75]  = 2000 ;
  450.     start[76]  = 1830 ;
  451.     start[77]  =  600 ;
  452.     start[78]  = 1200 ;
  453.     start[79]  =   30 ;
  454.     start[7]   = 1430 ;
  455.     start[80]  =  130 ;
  456.     start[81]  =    0 ;
  457.     start[82]  = 1700 ;
  458.     start[83]  =    0 ;
  459.     start[84]  =  800 ;
  460.     start[85]  =  700 ;
  461.     start[86]  = 2130 ;
  462.     start[87]  =  500 ;
  463.     start[88]  = 1530 ;
  464.     start[89]  = 1130 ;
  465.     start[8]   = 1900 ;
  466.     start[90]  = 1100 ;
  467.     start[91]  =  830 ;
  468.     start[92]  = 2230 ;
  469.     start[93]  =  900 ;
  470.     start[94]  = 2130 ;
  471.     start[95]  = 1630 ;
  472.     start[96]  = 2330 ;
  473.     start[97]  =  100 ;
  474.     start[98]  = 1400 ;
  475.     start[99]  =  130 ;
  476.     start[9]   = 1700 ;
  477.  
  478.  
  479.     s = 2330;
  480.     for(j=192; j<240; j++)
  481.     { start[j] = s; leng[j] = 150; if(0==(j%2)) s-=30; else s-=70; }
  482.  
  483.     s = 2330;
  484.     for(j=240; j<288; j++)
  485.     { start[j] = s; leng[j] = 180; if(0==(j%2)) s-=30; else s-=70; }
  486.  
  487.     s = 2330;
  488.     for(j=288; j<336; j++)
  489.     { start[j] = s; leng[j] = 210; if(0==(j%2)) s-=30; else s-=70; }
  490.  
  491.     s = 2330;
  492.     for(j=336; j<384; j++)
  493.     { start[j] = s; leng[j] = 240; if(0==(j%2)) s-=30; else s-=70; }
  494.  
  495.     s = 2330;
  496.     for(j=384; j<432; j++)
  497.     { start[j] = s; leng[j] = 270; if(0==(j%2)) s-=30; else s-=70; }
  498.  
  499.     s = 2330;
  500.     for(j=432; j<480; j++)
  501.     { start[j] = s; leng[j] = 300; if(0==(j%2)) s-=30; else s-=70; }
  502.  
  503.     } /* end of initializer block */
  504.  
  505.  
  506.     for(j=0; j<481; j++)
  507.     {
  508.         if(stime == start[j]) {
  509.             if(durat == leng[j]) break ;
  510.             }
  511.     }
  512.  
  513.     if( j >= 480 )
  514.     {
  515.         printf("oops, I dont have an entry for index %d\n", j);
  516.         fflush(stdout);
  517.         j = 0;
  518.     }
  519.  
  520.     return(j);
  521. }
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528. void    interleave(tblidx, cval, t8c5, t2c1)
  529.     int    tblidx, cval ;
  530.     int    *t8c5, *t2c1;
  531. {
  532.     int    small, big, b;
  533.  
  534.     small = 0;
  535.     big = 0;
  536.  
  537.     /* build t2c1 */
  538.     b = 0x00000001 & (tblidx >> 2) ;
  539.     small += (b << 4);
  540.  
  541.     b = 0x00000001 & (tblidx >> 1) ;
  542.     small += (b << 2);
  543.  
  544.     b = 0x00000001 & tblidx ;
  545.     small += b;
  546.  
  547.     b = 0x00000001 & (cval >> 1) ;
  548.     small += (b << 3);
  549.  
  550.     b = 0x00000001 & cval ;
  551.     small += (b << 1);
  552.  
  553.  
  554.     /* build t8c5 */
  555.     b = 0x00000001 & (tblidx >> 8) ;
  556.     big += (b << 9);
  557.  
  558.     b = 0x00000001 & (tblidx >> 7) ;
  559.     big += (b << 7);
  560.  
  561.     b = 0x00000001 & (tblidx >> 6) ;
  562.     big += (b << 5);
  563.  
  564.     b = 0x00000001 & (tblidx >> 5) ;
  565.     big += (b << 4);
  566.  
  567.     b = 0x00000001 & (tblidx >> 4) ;
  568.     big += (b << 3);
  569.  
  570.     b = 0x00000001 & (tblidx >> 3) ;
  571.     big += b;
  572.  
  573.     b = 0x00000001 & (cval >> 5) ;
  574.     big += (b << 8);
  575.  
  576.     b = 0x00000001 & (cval >> 4) ;
  577.     big += (b << 6);
  578.  
  579.     b = 0x00000001 & (cval >> 3) ;
  580.     big += (b << 2);
  581.  
  582.     b = 0x00000001 & (cval >> 2) ;
  583.     big += (b << 1);
  584.  
  585.  
  586.     *t8c5 = big;
  587.     *t2c1 = small;
  588. }
  589.  
  590.  
  591.  
  592.  
  593.  
  594. int    map_top(day, year, top, digits)
  595.     int    day, year, top, digits ;
  596. {
  597.     int    d2, d1, d0, y, poot ;
  598.     int    n2, n1, n0, f3, f2, f1, f0;
  599.  
  600.     y = year % 16 ;
  601.     d2 = top / 100 ;
  602.     d1 = (top % 100) / 10 ;
  603.     d0 = top % 10 ;
  604.  
  605.     f0 = 1;
  606.     f1 = (y + 1) % 10;
  607.     f2 = ( ((y+1)*(y+2)) / 2 ) % 10 ;
  608.     f3 = ( ((y+1)*(y+2)*(y+3)) / 6 ) % 10 ;
  609.  
  610.  
  611.     if(digits == 1)
  612.     {
  613.         n0 = ( (d0*f0) + (day*f1) ) % 10 ;
  614.         n1 = 0;
  615.         n2 = 0;
  616.     }
  617.  
  618.     if(digits == 2)
  619.     {
  620.         n0 = ( (d0*f0) + (d1*f1) + (day*f2) ) % 10 ;
  621.         n1 = ( (d1*f0) + (day*f1) ) % 10 ;
  622.         n2 = 0;
  623.     }
  624.  
  625.     if(digits == 3)
  626.     {
  627.         n0 = ( (d0*f0) + (d1*f1) + (d2*f2) + (day*f3) ) % 10 ;
  628.         n1 = ( (d1*f0) + (d2*f1) + (day*f2) ) % 10 ;
  629.         n2 = ( (d2*f0) + (day*f1) ) % 10 ;
  630.     }
  631.  
  632.  
  633.     poot =  (100*n2) + (10*n1) + n0 ;
  634.  
  635.     return( poot );
  636. }
  637.  
  638.  
  639.  
  640.  
  641.  
  642. void    offset(day, year, top, ofout, topout)
  643.     int    day, year, top ;
  644.     int    *ofout, *topout ;
  645. {
  646.     int    i, t, tx, off, digits, burp;
  647.     int    pwr ;
  648.  
  649.  
  650.     pwr = 1 ; digits = 0;
  651.     while(top >= pwr) { digits++; pwr *= 10; }
  652.     pwr = pwr / 10 ;
  653.  
  654.     t = tx = top ;
  655.     off = 0;
  656.     while(tx > 0) { off += (tx % 10);   tx /= 10; }
  657.  
  658. again:
  659.     for(i=0; i<=(year%16); i++)
  660.         {
  661.         burp = ( (map_top(day, i, t, digits)) % 10 ) ;
  662.         off += burp ;
  663.         }
  664.  
  665.     t = map_top(day, year, t, digits) ;
  666.     if(t < pwr) goto again ;
  667.  
  668.  
  669.     *ofout = (off % 32) ;
  670.     *topout = (t) ;
  671. }
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682. main(argc, argv)
  683.     int    argc;
  684.     char    *argv[];
  685. {
  686.     int    j, doneflag, trailers, tblidx ;
  687.     int    s1_out, bot3, top5, quo, rem, newspaper ;
  688.     int    s4_out, s5_out, ofout, cval ;
  689.     int    month, day, year, channel, starttime, duration ;
  690.  
  691.  
  692.  
  693.     if(argc == 7) goto clean;
  694.  
  695. upchuck:
  696.     printf("Usage: %s  month  day  year  channel  starting_time  length_in_minutes\n",
  697.         argv[0]);
  698.     exit(-1) ;
  699.  
  700.  
  701.  
  702. clean:
  703.  
  704.     month = atoi(argv[1]);
  705.     day = atoi(argv[2]);
  706.     year = atoi(argv[3]);
  707.     channel = atoi(argv[4]);
  708.     starttime = atoi(argv[5]);
  709.     duration = atoi(argv[6]);
  710.  
  711.     year = year % 100 ;
  712.  
  713.     if( (month>12) || (month<1) || (day<1) || (day>31) )
  714.     { printf("Invalid date\n"); goto upchuck; }
  715.  
  716.     if( (channel<1) || (channel>48) )
  717.     { printf("Invalid channel number\n"); goto upchuck; }
  718.  
  719.     trailers = starttime % 100;
  720.     if((trailers != 0) && (trailers != 30))
  721.     { printf("Invalid start time\n"); goto upchuck; }
  722.  
  723.     if((starttime < 0) || (starttime > 2330))
  724.     { printf("Sorry, I cant process that starting time\n"); goto upchuck; }
  725.  
  726.     trailers = duration % 30;
  727.     if((trailers!=0) || (duration<30) || (duration>300))
  728.     { printf("Sorry, I cant process that program length\n"); goto upchuck; }
  729.  
  730.  
  731.     /* get the  t  bits and the  c  bits */
  732.     cval = channel - 1 ;
  733.     tblidx = lookup(starttime, duration);
  734.  
  735.     /* from them infer what must have been step 4 & step 5 results */
  736.     interleave(tblidx, cval, (&s4_out), (&s5_out)) ;
  737.  
  738.     /* find the smallest unmapped_top giving correct mapped_top */
  739.     top5 = 0;
  740.     doneflag = 0;
  741.  
  742.     /* if the mapped_top is zero then top and offset are zero */
  743.     if(s4_out == 0) { top5 = 0; ofout = 0; doneflag = 1; }
  744.  
  745.     while(doneflag == 0)
  746.     {
  747.         top5++;
  748.         offset(day, year, top5, (&ofout), (&j)) ;
  749.         if(j == s4_out) doneflag = 1;
  750.     }
  751.  
  752.     /* have two of the three inputs to step 5; determine the rem */
  753.     for(rem=0; rem<32; rem++)
  754.     {
  755.         j = (rem + (day*(month+1)) + ofout) % 32 ;
  756.         if(j == s5_out) break ;
  757.     }
  758.     quo = (day - 1);
  759.  
  760.  
  761.     /* assemble the output of step 1 */
  762.     bot3 = 1 + rem + (32 * quo) ;
  763.     s1_out = bot3 + (1000 * top5) ;
  764.  
  765.     /* invert the mixing */
  766.     newspaper = f1(s1_out);
  767.  
  768.     printf(" %2d  %2d  %2d %3d  %4d  %3d    VCRPLUS_CODE= %8d\n",
  769.         month, day, year, channel, starttime, duration, newspaper);
  770.  
  771. }
  772.